(async function () {

   // 定义一个表示人的类
   class Person {
      // TS可以在属性前添加属性的修饰符
      /*
      *   public 修饰的属性可以在任意位置访问（修改） 默认值
      *   private 私有属性，私有属性只能在类内部进行访问（修改）
      *    - 通过在类中添加方法使得私有属性可以被外部访问
      *   protected 受包含的属性，只能在当前类和当前类的子类中访问（修改）
      *
      * */
      private _name: string;
      private _age: number;

      constructor(name: string, age: number) {
         if (age > 0) {
            this._age = age
         } else {
            throw new Error('age必须大于0')
         }

         this._name = name
      }

      /*
      *   getter方法用来读取属性
      *   setter方法用来设置属性
      *    - 它们被称为属性的存取器
      * */

      // // 定义方法，用来获取name属性
      // getName() {
      //    return this._name;
      // }
      // // 定义方法，用来设置name属性
      // setName(value: string) {
      //    this._name = value;
      // }

      // getAge() {
      //    return this._age;
      // }
      // setAge(value: number) {
      //    if (value >= 0) {
      //       this._age = value
      //    }
      // }


      // TS中设置getter和setter方法的方式
      get name() {
         return this._name
      }
      set name(val: string) {
         this._name = val
      }

      get age() {
         return this._age;
      }

      set age(val: number) {
         if (val > 0) {
            this._age = val
         }
      }

      async m(ctx?: object, next?: object) {
         return 1
      }
   }


   const per = new Person('zxm', 3)

   // console.log(per);
   // // per._name = 'lys' //错了
   // console.log(per.getName());
   // per.setName('lys')

   // per.setAge(-30) // 无用
   // console.log(per);



   console.log(per.m);
   console.log(await per.m());





   class A {
      // protected 受包含的属性，只能在当前类和当前类的子类中访问（修改）
      protected num: number;

      constructor(num: number) {
         this.num = num;
      }
   }

   class B extends A {
      name: string;
      constructor(name: string) {
         super(1)
         this.name = name
      }
      test() {
         console.log(this.num);
      }

   }
   let b0 = new B("b")
   console.log(b0);


   /* class C{
      protected  name: string;
      protected  age: number

        // 可以直接将属性定义在构造函数中
        constructor(name: string, age: number) {
            this.name = name;
             this.age = age;
        }

    }*/

   //  简化写法
   class C {

      // 可以直接将属性定义在构造函数中
      constructor(protected name: string, protected age: number) {
      }

   }
   const c = new C('xxx', 111);

   console.log(c);

})()